package com.cross.android;

import java.sql.SQLException;
import java.sql.Timestamp;

import android.database.sqlite.SQLiteDatabase;

import com.cross.core.Column;
import com.cross.core.Header;
import com.cross.core.Item;
import com.cross.jdbc.SimpleJdbcWriter;
import com.cross.util.ItemType;

/**
 * Android数据库写入器
 * 
 * @author www
 * 
 */
public class SimpleAndroidDBWriter extends SimpleJdbcWriter {
	
	private SQLiteDatabase db;
	private String sql = null;
	private Object[] bindArgs;
	/**
	 * 构造方法
	 * @param con
	 * @param header
	 * @throws SQLException
	 */
	public SimpleAndroidDBWriter(SQLiteDatabase db, Header header) throws SQLException {
		this.db = db;
		super.header = header;
	}

	private void setValue(int index, Object value){
		if(index> bindArgs.length){
			throw new RuntimeException("数组越界:数组长度为"+bindArgs.length + ",index:"+index);
		}
		bindArgs[index-1] = value;
	}
	/**
	 * 写入一行
	 * 
	 * @throws SQLException
	 */
	@Override
	protected void writeRow() {
		String type ;
		int parameterIndex = 0;
		
		if(table == null || !table.equals(header.getObjectName())){
			table = header.getObjectName();
			if(sql == null){
				sql = getPreparedStatement(header);
			}
		}
		
		bindArgs = new Object[header.size()];
		for(Column c : header.getColumns()){
			type = c.getType();
			if(ItemType.TYPE_STRING.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getString());
			} else if(ItemType.TYPE_DATE.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).get());
			} else if(ItemType.TYPE_TIME.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getTime());
			} else if(ItemType.TYPE_TIMESTAMP.equalsIgnoreCase(type)){
				Timestamp timestamp = currentRow.getItem(parameterIndex).getTimestamp();
				if(timestamp == null){
					setValue(parameterIndex+1, "");
				} else {
					setValue(parameterIndex+1, timestamp);
				}
			} else if(ItemType.TYPE_SHORT.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getShort());
			} else if(ItemType.TYPE_FLOAT.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getFloat());
			} else if(ItemType.TYPE_LONG.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getLong());
			} else if(ItemType.TYPE_INTEGER.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getInteger());
			} else if(ItemType.TYPE_DOUBLE.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getDouble());
			} else if(ItemType.TYPE_NUMBER.equalsIgnoreCase(type)){
				Number number = currentRow.getItem(parameterIndex).getNumber();
				if(number == null){
					setValue(parameterIndex+1, "");
				} else {
					setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getNumber().doubleValue());
				}
			} else if(ItemType.TYPE_BOOLEAN.equalsIgnoreCase(type)){
				Item item = null;
				Boolean b = null;
				item = currentRow.getItem(parameterIndex);
				b = item.getBoolean();
				if(b == null){
					setValue(parameterIndex+1, "");
				} else {
					setValue(parameterIndex+1, b);
				}
			} else if(ItemType.TYPE_BYTE.equalsIgnoreCase(type)){
				Byte b = currentRow.getItem(parameterIndex).getByte();
				if(b == null){
					setValue(parameterIndex+1, "");
				} else {
					setValue(parameterIndex+1, b.byteValue());
				}
			} else if(ItemType.TYPE_CHARACTER.equalsIgnoreCase(type)){
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).getCharacter()+"");
			} else {
				setValue(parameterIndex+1, currentRow.getItem(parameterIndex).get());
			}
			parameterIndex++;
		}
		try{
			db.execSQL(sql, bindArgs);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public void close() {
//		if(db != null){
//			if(db.isOpen()){
//				db.close();
//			}
//		}
	}
}
